package itheima05;

import domain.Users;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import utils.C3P0Util;

import java.sql.SQLException;
import java.util.List;

/*


    核心类QueryRunner
    空参构造:
        public QueryRunner(): 可以直接创建对象,但是没有传递Connection连接对象
            所以该对象调用方法,执行增删改查时,必须传Connection连接对象
    执行查询:
        public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) :
            执行查询,根据参数ResultSetHandler获取对应的结果
            参数:
                1.Connection conn: 连接对象
                2.String sql: sql语句,参数用?代替
                3.ResultSetHandler<T> rsh: 结果集处理器,接口,必然传递实现类对象
                    实现类: 根据不同的方式处理ResultSet,返回不同结果

                4.Object... params: 可变参数,传递参数列表,数组,不传参  作用: 给sql中?进行赋值的

 */
/*public class Demo09DBUtils {
    //查询指定列的数据,存储到List集合中
    @Test
    public void queryCols() throws SQLException {
        *//*
            结果集处理器: ColumnListHandler
            作用: 把查询结果的某一列,存储到List集合对象
            构造方法:
                public ColumnListHandler(): 把第一列的内容存储到List集合中
                public ColumnListHandler(int index): 把指定编号对应的列的内容存储到List集合中
                public ColumnListHandler(String name): 把指定列名对应的列的内容存储到List集合中
         *//*
        QueryRunner qr = new QueryRunner();

        String sql = "select * from users";
        *//*
            new ColumnListHandler(): 告诉QueryRunner要第一列数据

         *//*
        //List<Object> list = qr.query(C3P0Util.getConnection(), sql, new ColumnListHandler());
        *//*
            new ColumnListHandler(2): 告诉QueryRunner要第二列数据

         *//*
        //List<Object> list = qr.query(C3P0Util.getConnection(), sql, new ColumnListHandler(2));
        List<Object> list = qr.query(C3P0Util.getConnection(), sql, new ColumnListHandler("upass"));
        for (Object o : list) {
            System.out.println(o);
        }

    }

    //获取结果中第一行中的指定列对应的值
    @Test
    public void queryOnlyCol() throws SQLException {
         *//*
            结果集处理器: ScalarHandler  用途: 用于聚合函数
            作用: 获取查询结果的第一行的某一列
            构造方法:
                public ScalarHandler(): 获取查询结果的第一行的第一列
                public ScalarHandler(int index): 获取查询结果的第一行的第index列
                public ScalarHandler(String name): 获取查询结果的第一行的name列
         *//*
        String sql = "select count(*) from users";

        QueryRunner qr = new QueryRunner();
        Object result = qr.query(C3P0Util.getConnection(), sql, new ScalarHandler());
        System.out.println(result);
    }

    //获取结果中第一行中的指定列对应的值
    @Test
    public void queryOnlyCol2() throws SQLException {
         *//*
            结果集处理器: ScalarHandler  用途: 用于聚合函数
            作用: 获取查询结果的第一行的某一列
            构造方法:
                public ScalarHandler(): 获取查询结果的第一行的第一列
                public ScalarHandler(int index): 获取查询结果的第一行的第index列
                public ScalarHandler(String name): 获取查询结果的第一行的name列
         *//*
        String sql = "select * from users where uid=?";

        QueryRunner qr = new QueryRunner();
        Object result = qr.query(C3P0Util.getConnection(), sql, new ScalarHandler(2),"u004");
        System.out.println(result);
    }

    //获取结果中第一行中的指定列对应的值
    @Test
    public void queryOnlyCol3() throws SQLException {
         *//*
            结果集处理器: ScalarHandler  用途: 用于聚合函数
            作用: 获取查询结果的第一行的某一列
            构造方法:
                public ScalarHandler(): 获取查询结果的第一行的第一列
                public ScalarHandler(int index): 获取查询结果的第一行的第index列
                public ScalarHandler(String name): 获取查询结果的第一行的name列
         *//*
        String sql = "select * from users";

        QueryRunner qr = new QueryRunner();
        Object result = qr.query(C3P0Util.getConnection(), sql, new ScalarHandler("upass"));
        System.out.println(result);
    }

}*/


public class Demo09DBUtils {
    @Test
    public void  queryCols() throws SQLException {
        //public ColumnListHandler(): 把第一列的内容存储到List集合中
        //public ColumnListHandler(int index): 把指定编号对应的列的内容存储到List集合中
        //public ColumnListHandler(String name): 把指定列名对应的列的内容存储到List集合中
        QueryRunner queryRunner=new QueryRunner();
        String sql="select * from users";
        List<Object> list=queryRunner.query(C3P0Util.getConnection(),sql,new ColumnListHandler());
        System.out.println(list);

        List<Object> list1=queryRunner.query(C3P0Util.getConnection(),sql,new ColumnListHandler(2));
        System.out.println(list1);

        List<Object>list2=queryRunner.query(C3P0Util.getConnection(),sql,new ColumnListHandler("uname"));
        System.out.println(list2);
    }

    @Test
    public  void queryScal() throws SQLException {
        //public ScalarHandler(): 获取查询结果的第一行的第一列
        //public ScalarHandler(int index): 获取查询结果的第一行的第index列
        //public ScalarHandler(String name): 获取查询结果的第一行的name列
        QueryRunner queryRunner=new QueryRunner();
        String sql="select * from users";

        Object result =queryRunner.query(C3P0Util.getConnection(),sql,new ScalarHandler());
        System.out.println(result);

        Object result1 =queryRunner.query(C3P0Util.getConnection(),sql,new ScalarHandler(2));
        System.out.println(result1);

        Object result3=queryRunner.query(C3P0Util.getConnection(),sql,new ScalarHandler("upass"));
        System.out.println(result3);
    }
    @Test
    public  void queryOnlyCol3() throws SQLException {
        QueryRunner queryRunner=new QueryRunner();
        String sql="select * from users where uid=?";
        //查询结果的第三列wkr
        Object query = queryRunner.query(C3P0Util.getConnection(),sql,new ScalarHandler("upass"),"u009");
        System.out.println(query);
    }
}